import java.util.Arrays;

/**
 * 队列主类
 * 实现队列的基本操作和数组合并排序功能
 */
public class QueueMain {
    public static void main(String[] args) {
        System.out.println("=== 队列作业演示 ===");

        // 初始化数据
        int[] arrayA = { 19, 9, 29, 59, 49, 39, 69, 89 };
        int[] arrayB = { 8, 48, 28, 38, 18, 98, 68, 28, 88 };

        System.out.println("数组A: " + Arrays.toString(arrayA));
        System.out.println("数组B: " + Arrays.toString(arrayB));
        System.out.println();

        // 测试顺序队列
        testArrayQueue(arrayA, arrayB);

        // 测试链队列
        testLinkedQueue(arrayA, arrayB);

        // 数组合并排序
        mergeAndSort(arrayA, arrayB);
    }

    /**
     * 测试顺序队列
     */
    private static void testArrayQueue(int[] arrayA, int[] arrayB) {
        System.out.println("=== 顺序队列测试 ===");

        // 创建顺序队列
        ArrayQueue<Integer> queueA = new ArrayQueue<>(20);
        ArrayQueue<Integer> queueB = new ArrayQueue<>(20);

        // 数组A入队
        System.out.println("数组A入队:");
        for (int value : arrayA) {
            queueA.enqueue(value);
            System.out.println("入队: " + value);
        }
        queueA.display();
        System.out.println();

        // 数组B入队
        System.out.println("数组B入队:");
        for (int value : arrayB) {
            queueB.enqueue(value);
            System.out.println("入队: " + value);
        }
        queueB.display();
        System.out.println();

        // 数组A出队
        System.out.println("数组A出队:");
        while (!queueA.isEmpty()) {
            Integer value = queueA.dequeue();
            System.out.println("出队: " + value);
        }
        System.out.println();

        // 数组B出队
        System.out.println("数组B出队:");
        while (!queueB.isEmpty()) {
            Integer value = queueB.dequeue();
            System.out.println("出队: " + value);
        }
        System.out.println();
    }

    /**
     * 测试链队列
     */
    private static void testLinkedQueue(int[] arrayA, int[] arrayB) {
        System.out.println("=== 链队列测试 ===");

        // 创建链队列
        LinkedQueue<Integer> queueA = new LinkedQueue<>();
        LinkedQueue<Integer> queueB = new LinkedQueue<>();

        // 数组A入队
        System.out.println("数组A入队:");
        for (int value : arrayA) {
            queueA.enqueue(value);
            System.out.println("入队: " + value);
        }
        queueA.display();
        System.out.println();

        // 数组B入队
        System.out.println("数组B入队:");
        for (int value : arrayB) {
            queueB.enqueue(value);
            System.out.println("入队: " + value);
        }
        queueB.display();
        System.out.println();

        // 数组A出队
        System.out.println("数组A出队:");
        while (!queueA.isEmpty()) {
            Integer value = queueA.dequeue();
            System.out.println("出队: " + value);
        }
        System.out.println();

        // 数组B出队
        System.out.println("数组B出队:");
        while (!queueB.isEmpty()) {
            Integer value = queueB.dequeue();
            System.out.println("出队: " + value);
        }
        System.out.println();
    }

    /**
     * 数组合并并排序
     */
    private static void mergeAndSort(int[] arrayA, int[] arrayB) {
        System.out.println("=== 数组合并排序 ===");

        // 合并两个数组
        int[] mergedArray = new int[arrayA.length + arrayB.length];
        System.arraycopy(arrayA, 0, mergedArray, 0, arrayA.length);
        System.arraycopy(arrayB, 0, mergedArray, arrayA.length, arrayB.length);

        System.out.println("合并前: " + Arrays.toString(mergedArray));

        // 排序
        Arrays.sort(mergedArray);

        System.out.println("合并后排序: " + Arrays.toString(mergedArray));

        // 使用队列演示排序后的数据
        System.out.println("\n使用顺序队列演示排序后的数据:");
        ArrayQueue<Integer> sortedQueue = new ArrayQueue<>(mergedArray.length);

        // 入队
        System.out.println("排序后的数据入队:");
        for (int value : mergedArray) {
            sortedQueue.enqueue(value);
            System.out.println("入队: " + value);
        }
        sortedQueue.display();

        // 出队
        System.out.println("排序后的数据出队:");
        while (!sortedQueue.isEmpty()) {
            Integer value = sortedQueue.dequeue();
            System.out.println("出队: " + value);
        }
    }
}
